;~ Tuos kur yra komentare varnele (;~) tai istrink kai atsiskaitinesi kitus
;~ komentarus (;) palik. Sita komentara, 2 eilutes irgi istrink :)

.model small                          ;~ Sitaip reikia visuose

.stack 100h                           ;~ Stekas ir jo dydis, dydis beveik nesvarbu

.data                                 ;~ Cia bus tavo tekstukai su pavadinimais kuriuos spausdinsi 
    tekstas db 'Tekstas: $'           ;~ Sita atspausdins pradzioje
    skaicius db 13,10,'Skaicius: $'   ;~ Sita kai suskaiciuos atsakyma
    ivesti db 255                     ;~ 1 Baitas su reiksme 255, kuris pasko kad galesim ivesti stringa <= 255 
           db ?                       ;~ 1 Baitas be pavadinimo ir be reiksmes, ? reiskia be reiksmes
           db 255 dup (?)             ;~ 255 Baitai laisvi, be pavadinimo, visi be reiksmiu, cia bus stringas 
    
.code                                 ;~ KODAS
start:                                ;~ pradedam nuo cia, t.y. start: nes gale yra "end start", kuris pasako kad prasideda nuo "start", t.y. cia :)
    mov ax, @data                     ;~ @data tai adresas segmento kur buvo ".data"
    mov ds, ax                        ;~ Mums reikia DS = @data, bet negalima, tai darom AX = @data, tada DS = AX

    ; Atspausdina "Tekstas: "
    mov ah, 09h                       ;~ 9 reiskia atspausdinti teksta kur ds ir dx rodo, ds nustatyti nereikia nes jis jau nustatytas virsuje
    lea dx, tekstas                   ;~ dx rodo i 'Tekstas: $' (ziurek virsuj)
    int 21h                           ;~ ivykdome
    
    ; Ivedimas
    mov ah, 0ah                       ;~ 0A (arba 10) reiskia nuskaityti stringa ir ideti i laiva vieta ds ir dx, ds nustatytas jau virsuje
    lea dx, ivesti                    ;~ dx rodo i tuscia 1+1+255 vieta pavadinimu "ivesti" (ziureti virsuje)
    int 21h                           ;~ ivykdome
    
    ; Atspausdina "Skaicius: "
    mov ah, 09h                       ;~ tas pats kaip atspaudina 'Tekstas'
    lea dx, skaicius                  ;~ tik dx rodo i kita stringa kuri atspausdinsime
    int 21h    
    
    ; Skaiciuojame skaicius           
    mov ch, 0                         ;~ CX skaitliukas perbegs per visus simbolius todel ji nustatome kiek yra tu simboliu, CH = 0 
    lea bx, ivesti+2                  ;~ BX tai adresas pirmo simbolio (tiksliau BX+SI), tai kur buvo "db 255 dup (?)", kadangi jis neturi pavadinimo, tai imame pavadinima "ivesti" kuris yra 2 arciau ir pridedam 2
    xor al, al                        ;~ AL = 0, al saugos kiek yra skaiciu tarp simboliu, kiekviena kart sutike raide AL = AL + 1
    xor si, si                        ;~ SI = 0, pirmo simbolio adresas yra BX+SI, BX adresas o SI 0, poto antram simboliui SI = 1, taigi BX+SI jau vienu didesnis, nes BX nekeisim  
kartok:
    
	
     
    cmp cx, 0
	je  perskaiciau
	
    cmp [bx + si], byte ptr '0'       ;~ Lyginam n-taji simboli su '0'
    jnae read_error                   ;~ jei maziau tai garantuotai nera skaicius, einam i "neskaicius" jei daugiau, einam toliau
    
    cmp [bx + si], byte ptr '9'       ;~ Jei maziau uz '9' (ir kaip zinia daugiau uz '0') tai reiskia cia skaicius
    jnbe read_error                   ;~ jei ne einam i "neskaicius"
    
    sub	al,'0'
	xor	ah,ah
	
	mov	bx,ax
	mov	ax,cx
	mov	dx,0Ah
	mul	dx
	
	
	add	ax,bx
	mov	cx,ax
	
    inc si                            ;~ SI = SI + 1 Pasiruosiam adresa kitam simboliui
    loop kartok                       ;~ Jei CX dar nesibaige, t.y. dar ne visi skaiciai nuskaityti einam i kita simboli "kartok"
    
     read_error:
	
	mov	dx,offset error
	mov	ah,9
	int	21h
	jmp	exit


   
   perskaiciau:
	
	mov	dx,offset ats
	mov	ah,9
	int	21h 
	
print_number:
	mov	dx,cx
	shr	dx,12
	and	dx,0Fh
	cmp	dx,9
	ja	raide1
	add	dx,'0'
	jmp	done1
raide1:
	add	dx,'A'
	sub	dx,0Ah
done1:
	mov	ah,2
	int	21h	

	mov	dx,cx
	shr	dx,8
	and	dx,0Fh
	cmp	dx,9
	ja	raide2
	add	dx,'0'
	jmp	done2
raide2:
	add	dx,'A'
	sub	dx,0Ah
done2:
	mov	ah,2
	int	21h

	mov	dx,cx
	shr	dx,4
	and	dx,0Fh
	cmp	dx,9
	ja	raide3
	add	dx,'0'
	jmp	done3
raide3:
	add	dx,'A'
	sub	dx,0Ah
done3:
	mov	ah,2
	int	21h

	mov	dx,cx
	and	dx,0Fh
	cmp	dx,9
	ja	raide4
	add	dx,'0'
	jmp	done4
raide4:
	add	dx,'A'
	sub	dx,0Ah
done4:
	mov	ah,2
	int	21h

exit1:
jmp exit
print_done:
	mov	dx,offset raide
	mov	ah,9
	int	21h
	;Exit program
exit:
	mov	ax,4C00h
 	int	21h
end start